<?php
class Dispatcher{
	/**
	 * Dispatcher
	 * Permet de charger le controleur en fonction de la requete utilisateur
	 */
	
	var $request;//var qui recupere tout au niveau de la requete savoir ce qui a ete fait
	
	/**
	 * Fonction principale du dispatcher
	 * Charge le controleur en fonction du routing
	 */
	function __construct()
	{	
		//Nouveau Request pour r�cup�rer l'url
		$this->request=new Request();
		//on d�coupe l'url pour r�cup�rer le controleur et l'action
		Router::parse($this->request->url,$this->request);
		//On lance le controleur
		$controleur=$this->loadControleur();
		//On regarde si la m�thode existe bien dans le controleur sinon on envoie un message d'erreur
		if (!in_array($this->request->action,array_diff(get_class_methods($controleur),get_class_methods('Controleur')))){
			$this->error('le controleur '.$this->request->controleur.' n\'a pas de methode "'.$this->request->action.'"');
		}
		//On lance la m�thode avec les param�tres envoy�s
		call_user_func_array(array($controleur,$this->request->action),$this->request->params);
		//On renvoie une vue de m�me nom que la m�thode
		$controleur->render($this->request->action);
	}
	/**
	 * 
	 * Permet de g�n�rer une page d'erreur en cas de probleme au niveau du rooting (page inexistante)
	**/
	function error($message)
	{
		$controleur=new Controleur($this->request);
		$controleur->e404($message);
	}
	
	/**
	 * 
	 * Permet de charger le controleur en fonction de la requete utilisateur 
	 **/
	function loadControleur()
	{	//On r�cup�re le nom du controleur voulu on met sa premi�re lettre en majuscule puis son nom suivi de Controleur pour que cela corresponde au nom du fichier php
		$name=ucfirst($this->request->controleur).'Controleur';	
		//On r�cup�re le fichier php
		$file=ROOT.DS.'Controleur'.DS.$name.'.php';
		//On regarde s'il existe sinon on envoie le message d'erreur
		if (!file_exists($file))
		{
			$this->error('Le controleur '.$this->request->controleur.' n\'existe pas');
		}
		//inclusion du controleur voulu
		require $file;
		//cr�ation d'un objet de la classe de ce controleur
		$controleur=new $name($this->request);
		//On retourne l'objet pour appel� les m�thodes dessus
		return $controleur;
	}
	
	
}
?>